#include <stdio.h>

#include <evalsoc.h>

#include "test_wdt.h"


void eclik_init() {

	CLIC_Type *clic = (CLIC_Type *)ECLIC_BASE;

	//配置ID=32 timer中断
	clic->CTRL[32].INTIE = 0x1; // 使能ID=32的中断
	clic->CTRL[32].INTATTR = 0xc5; // 配置中断属性 c5-11000101 11000-保留位 10-上升沿触发中断 1-中断矢量化
	clic->CTRL[32].INTCTRL = 0x7F; // 配置中断级别 优先级

	//配置ID=30 rtc中断
	clic->CTRL[30].INTIE = 0x1; // 使能ID=30的中断
	clic->CTRL[30].INTATTR = 0xc5; // 配置中断属性 c5-11000101 11000-保留位 10-上升沿触发中断 1-中断矢量化
	clic->CTRL[30].INTCTRL = 0x7F; // 配置中断级别 优先级

	//配置ID=29 wdt中断
	clic->CTRL[29].INTIE = 0x1; // 使能ID=29的中断
	clic->CTRL[29].INTATTR = 0xc5; // 配置中断属性 c5-11000101 11000-保留位 10-上升沿触发中断 1-中断矢量化
	clic->CTRL[29].INTCTRL = 0x7F; // 配置中断级别 优先级


	printf("init eclik\n");
}	


//矢量表中 ID=32的中断处理函数 timer
__attribute__ ((interrupt))  void eclik_interrupt_handler_timer() {
	dw_timer_regs_t *time = (dw_timer_regs_t *)TIMER3_BASE;
    static int count = 0;

	count++;
	
	time->TEOI; // 清除定时器中断标志位

	printf("timer:%d\n",count);

	if(count % 10 == 0){
		time->TCR = 0x0; // 关闭定时器0

		printf("timer stop\n");
	}
}

//矢量表中 ID=30的中断处理函数 rtc
__attribute__ ((interrupt))  void eclik_interrupt_handler_rtc() {
	dw_rtc_regs_t *rtc = (dw_rtc_regs_t *)RTC_BASE;
	static int count = 0;

	count++;
	if(count % 5 == 0){
		rtc->EOI; // 清除RTC中断标志位
	}
	printf("rtc :%d\n",count);
}
//矢量表中 ID=29的中断处理函数 wdt
__attribute__ ((interrupt))  void eclik_interrupt_handler_wdt() {
	dw_wdt_regs_t *wdt = (dw_wdt_regs_t *)WDT_BASE;
	static int count = 0;

	count++;

	wdt->CCR=0x76; // 重新启动计数器-喂狗

	printf("count:%d\n",count);

	if(count % 5 == 0){
		printf("wdt interrupt pass\n");
		wdt_init_reset(WDT_BASE); //重启系统
	}
}